package com.kimari.demo;

/**
 * 算法练习一
 *
 * @author Reimu
 */
public class Test {

    /**
     * 传入一个 int 数，
     * 要求清除该数的低 8 位，高 24 位不变，
     * 将结果以十进制形式输出
     * @param num 需要操作的数字
     * @return 返回操作后的数字
     */
    public static int clearLow8(int num) {
        //Integer.MAX_VALUE 是 int 最大的数字即 32 个 1
        //255 的二进制是 8 个 1
        //括号中得出的结果是后 8 位为 0
        //根据与运算，任何数和 0 与 都为 0
        return num & (Integer.MAX_VALUE - 255);
    }

    /**
     * 传入一个 int 数
     * 要求将该数的低 16 位置 1，高 16 位不变，
     * 将结果以十进制形式输出
     * @param num 需要操作的数字
     * @return 返回操作后的数字
     */
    public static int replaceLow16(int num) {
        //任何位与 1 或 都为 1
        //65535 是 16 个 1
        return num | 65535;
    }

    /**
     * 实现两个 int 类型变量值的交换，
     * 要求不使用中间变量
     * @param numOne 第一个数字
     * @param numTwo 第二个数字
     * @return 返回一个数组接收数字
     */
    public static int[] swap(int numOne, int numTwo) {
        numTwo = numTwo - numOne;
        numOne = numOne + numTwo;
        numTwo = numOne - numTwo;
        return new int[]{numOne, numTwo};
    }

    /**
     * 以二进制形式输出一个十进制数
     * @param num 需要输出的数
     * @return 输出的结果
     */
    public static String binaryOutput(int num) {
        //构造字符串对象
        StringBuilder str = new StringBuilder();
        while (num != 0) {
            //调用构造字符串中的方法 让每次余二的结果拼接在字符串后面
            str.insert(0, num % 2);
            //在数字余二后，除以2得到下一个数
            num = num / 2;
        }
        return str.toString();
    }
}
